{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Modeling and Simulation in Python\n",
    "\n",
    "Case study\n",
    "\n",
    "Copyright 2017 Allen Downey\n",
    "\n",
    "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Configure Jupyter so figures appear in the notebook\n",
    "%matplotlib inline\n",
    "\n",
    "# Configure Jupyter to display the assigned value after an assignment\n",
    "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n",
    "\n",
    "# import functions from the modsim.py module\n",
    "from modsim import *"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Yo-yo\n",
    "\n",
    "Suppose you are holding a yo-yo with a length of string wound around its axle, and you drop it while holding the end of the string stationary.  As gravity accelerates the yo-yo downward, tension in the string exerts a force upward.  Since this force acts on a point offset from the center of mass, it exerts a torque that causes the yo-yo to spin.\n",
    "\n",
    "![](diagrams/yoyo.png)\n",
    "\n",
    "This figure shows the forces on the yo-yo and the resulting torque.  The outer shaded area shows the body of the yo-yo.  The inner shaded area shows the rolled up string, the radius of which changes as the yo-yo unrolls.\n",
    "\n",
    "In this model, we can't figure out the linear and angular acceleration independently; we have to solve a system of equations:\n",
    "\n",
    "$\\sum F = m a $\n",
    "\n",
    "$\\sum \\tau = I \\alpha$\n",
    "\n",
    "where the summations indicate that we are adding up forces and torques.\n",
    "\n",
    "As in the previous examples, linear and angular velocity are related because of the way the string unrolls:\n",
    "\n",
    "$\\frac{dy}{dt} = -r \\frac{d \\theta}{dt} $\n",
    "\n",
    "In this example, the linear and angular accelerations have opposite sign.  As the yo-yo rotates counter-clockwise, $\\theta$ increases and $y$, which is the length of the rolled part of the string, decreases.\n",
    "\n",
    "Taking the derivative of both sides yields a similar relationship between linear and angular acceleration:\n",
    "\n",
    "$\\frac{d^2 y}{dt^2} = -r \\frac{d^2 \\theta}{dt^2} $\n",
    "\n",
    "Which we can write more concisely:\n",
    "\n",
    "$ a = -r \\alpha $\n",
    "\n",
    "This relationship is not a general law of nature; it is specific to scenarios like this where there is rolling without stretching or slipping.\n",
    "\n",
    "Because of the way we've set up the problem, $y$ actually has two meanings: it represents the length of the rolled string and the height of the yo-yo, which decreases as the yo-yo falls.  Similarly, $a$ represents acceleration in the length of the rolled string and the height of the yo-yo.\n",
    "\n",
    "We can compute the acceleration of the yo-yo by adding up the linear forces:\n",
    "\n",
    "$\\sum F = T - mg = ma $\n",
    "\n",
    "Where $T$ is positive because the tension force points up, and $mg$ is negative because gravity points down.\n",
    "\n",
    "Because gravity acts on the center of mass, it creates no torque, so the only torque is due to tension:\n",
    "\n",
    "$\\sum \\tau = T r = I \\alpha $\n",
    "\n",
    "Positive (upward) tension yields positive (counter-clockwise) angular acceleration.\n",
    "\n",
    "Now we have three equations in three unknowns, $T$, $a$, and $\\alpha$, with $I$, $m$, $g$, and $r$ as known parameters.  It is simple enough to solve these equations by hand, but we can also get SymPy to do it for us.\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sympy import init_printing, symbols, Eq, solve\n",
    "\n",
    "init_printing()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "T, a, alpha, I, m, g, r = symbols('T a alpha I m g r')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAE4AAAAJCAYAAACc9xrJAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAB7klEQVRIDdWWi00CQRRFWUMBJlYgdkCkA+wAtQKwA40VGOgArcBPB2gFRDqQDgh0gOcMM7DAQoIx0X3Jm5n3G+a+vbNLNp/PK0myLKuxvkNn6DH6hd6jp+TpK7WArwuASQRxxvwKrvdNUOQ18dXRBtpGz6PNVKlQ03MIim3yFK3lfJ+LvEVO8hfN5Hko8w/RftFev+3jTBJCEjTT3qwlxhJvtFvGkW6cB6zFk/za0xCLCWmTjnZSkvroINllncFg00Iz8hjEhoaHx3yL2geZlhplnazMk6uuXSWgyBaLXjRyIgtt3p8J18ZzfRx4gDbgRtZQ7/ll3IP2hoyxvYbKCTUz8sfWxt+17iZEGfCvrjWGfim7xixsD2wwdNi8Mirn38KWcBCTMMYDcZLfGWmhLItxV2NnbVJ4QlZEkW1WbvpTfG1mH3881KwF9hs+3cv9KT+P7sGW31TsQ84xyztZX6A7saeras3QISfXrBPd7f6IzaV2oRDza/yvxGbQPM/ku2qXzMh7Kwhe4Xss8AfXkZuz8u56n4PwYx0WviRToxrkpfUiqTyj4GXPmkSM+mSc70LxBmFtL/Q/LzzbY0ZDLDLpCU2ss5E21OunT7atXow4yiTgE4eyZB54ApuI+fEQ6wRfzyR84aOI7X+9QvkGjRGdEcRjQZEAAAAASUVORK5CYII=\n",
      "text/latex": [
       "$\\displaystyle a = - \\alpha r$"
      ],
      "text/plain": [
       "a = -α⋅r"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "eq1 = Eq(a, -r * alpha)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAH4AAAASCAYAAACdFWqpAAAACXBIWXMAAA7EAAAOxAGVKw4bAAADqUlEQVRoBe2ai1HcMBCGfTcUkIQKIB0woQPogJAKAh3ApIIM1wHQAUkHQAUEOuA6CLiDy/8pWkfWyXfc2PFjxjujk7RaeV/a1dowWSwW2WQy2c2y7FktV/vle3XZET+COzXWAGj31Gbaew5ihOFZYOIdf4HosSN1IF6FfhH+Y6ia8JeaPwp/FeLH8XAssOVF3ZUTP4di+yzwTribEO/Hj+rnCfyIGogFpnIwafs2Ie+Bx6XWOBBcCSMM1AJT5K5I2YdeJ+73GJ60x+78eG2cD8AC7o5PyVl1v6do28RJLgpODiXFKMCVc6qD6A6q1slUjClCrfi0InVfuAfRznym+6L5bzXwl8KnDrmW2gPJZXITWGRW9PymtmPB1oiOehgRX2piAvOFGsYorXU5lzwUobcmg8ZLckLDOnS+nQX0GJLFM7WDAM/BeLX5ql50yECNs0l7kx31TA4tBTU1l7O756PpPz8IV1tHK+70rBKsut9LhG1NdMpxDg57bzxljLnwTF0dojH1yoNf51Dkopn5Od0HP94WPoxu8ByKtaB9lkXW0m5CINnh/0PtHL2CvdRSLzZvSscqx6+6302Gyt4rcV9JkF74KoWf0ksOe63fO9HkRuONwNScOOcZnj+ONz1sCwcD+P63K36hs2cUyJYHZBKcH79FEYS8Phs0o6MMtZTKxYF085xa6wInWXAYKfok5K85GWBJTuHIDiIt6yYcBkzRo29xJcT72piLPzIU1xg8BRwEBnuxDMLV0nEp4hUtRErq5AndGXzynOOorIpU8KnsQfT8DLWQvuDQ1+HJFjJyHtKEY60TmezZBIjS0neScDM8NafFMjs+2hvj2V5Lx1S0n+ihnLKj+JR1NUcWZIr5V8kpPNHjCiDbozmGRa+iqGNNYF8hGXPoW9dbPE22Em/hufP5QqrO2SAs+mrpOOWJEdjJjKMrImt16mRRZOAYBxpjFKAkp6fBkPGHJ4ueEr3oyCaG47WwlBG09t9BPHMxQYZQPwKQK84KvX3RuXETOm7pwfyRhvQFU5oVQPfCw8i996rvDDCMZCG1Xainat9WQzZSKEYLAR3AmzNtDXzqbwsUeod6LoYOiyjb11ZPwF1LDuoWAPlNZ3DhQa6tY+UHHDj3GWQgDIGDT/ssZ19lm/ZVsFAuOdmykENrTiondVu6D8nH8Rss0HvHy8nuS5l3tqmEw68S6dzWx36NBdwdv4am62VSOnfasXc+/xvAJ9DWi7CuDdEk/z9IY4Rwt6ZxFQAAAABJRU5ErkJggg==\n",
      "text/latex": [
       "$\\displaystyle T - g m = a m$"
      ],
      "text/plain": [
       "T - g⋅m = a⋅m"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "eq2 = Eq(T - m * g, m * a)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAEwAAAAOCAYAAACFB/pMAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACoElEQVRYCdWXi1EbQQxAbSYFuAbSASQdmA5IOgA6CCVkoAOSChLSAaSCAB3gVEDiDpz3dlbMnU/nOTyTnKMZ3d5K2tXntFrddLVaTabT6f5kMnkEl+BdHRkmxz6AW1CeoOwBeMnacwm7Dvj3ARvfguHPA+/6eYEPC8bBMK0Bu3DFegBQ9BvyL+ivmztCv2J+D/1Tk77r79i9wsYH7D7c1tZXdeE+m7xrbsLmZtIM/Nqk1/d7xhd9mWSPf0rCn3lV6GnZGvbYyON1k+wQCjKegTSl/yc4qsZm/gz2Y0/JnqMVCrIvYlpHTRusbGTBkgDYnfkz2LRSwzJpMi+tX+uyNdXNUovqCfgGdF4AAy/jfcwRO61ft9gTidAxBxlr+VNlWLev1wMcNay1mIWb6ldLlskRm56zxlT/Dn40SHVu8DYGrBoZxx/xQXCHjrNBkgihI/ZPjyN8/ZV3FgGCZtn5yXgIbVHnc49jBxE8Bf0ixxk/aPDNpCLDaFviFyn78a6RBzEfc8QOM0d/Unuga7stRisW0AzilXTA1mTWEogFMK5BpWZBy8bgO1b5eSY3Ng3bvNUxox0Q54AtUupr5dk+KVcC2hcw69djpiCjIWtDCKtr0C7QtA28yWyBrq99PDNTvmNJnk4Nq+fZjMn6L8gpWEjtnl8M6NOYqDFD1y9wvtU39i1k/9i7U79qXdLXTbbL/4G+pTo6AYPWq8AFPfAe+lZdP4b87d+ruBU77YRBIGi6ZA3rgyVy34JZ+rCY1DG+XEfBmlyZojBu1C8Zfwdo5f8Rp/uyyA8dQX02F7+8+AQzzJu2tErNf0kdF6OHUoG/P6Zjb2vARmakN0nrfxPaaIBNOvkZbPpjlniUOxmNvGVBeM405MqJgeel4HF8Mg5/AGSm93rSTeMmAAAAAElFTkSuQmCC\n",
      "text/latex": [
       "$\\displaystyle T r = I \\alpha$"
      ],
      "text/plain": [
       "T⋅r = I⋅α"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "eq3 = Eq(T * r, I * alpha)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/latex": [
       "$\\displaystyle \\left\\{ T : \\frac{I g m}{I + m r^{2}}, \\  a : - \\frac{g m r^{2}}{I + m r^{2}}, \\  \\alpha : \\frac{g m r}{I + m r^{2}}\\right\\}$"
      ],
      "text/plain": [
       "⎧                      2              ⎫\n",
       "⎪    I⋅g⋅m       -g⋅m⋅r        g⋅m⋅r  ⎪\n",
       "⎨T: ────────, a: ────────, α: ────────⎬\n",
       "⎪          2            2            2⎪\n",
       "⎩   I + m⋅r      I + m⋅r      I + m⋅r ⎭"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "soln = solve([eq1, eq2, eq3], [T, a, alpha])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAEoAAAAsCAYAAADCfS42AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFEUlEQVRoBe2ajXUUNxCA7/wogJ8OTAeGdIA7IKSChA5MCXmmA5MK8kIHQAUO7gB3ELgOzPcJjXKr2/Xez+6ezbt5TydpNBppRjOjPUnzm5ub2dAwn8/P4PkL6WXmfUX+L+mc8a4z7l5l8zEUFRpAYa7CFWM8C9x9zY/GmjhKepF5fxxrjCn5jqYohDjNgnyYUqCxxhrN9bCoz0z6BLebjzX5Kfk+GHGwE3j3uh0KNeBrfV/yXAz2r1FwssjswpaPSW8yTWwSbhiX0L6FzvF+I/1HEn8Bvnd86NYDmM2GToxsfDKQn93Gm/Zz0oegoawy7KeQaV6U3SnJZrqwqfCk/JCUxiF/sdRHRX6L+hD5WBYV8alzRbMl+RnxiJQAga7BW05xLVvJ5Y/WpMQFNG9z3exxLj8BvzyWeJU4HAyh7ZoHszM+ge62Vtq/kYo1SQvoPhYe5nrJM75YTW7Xcgp9jAfuH1KDd7Rtm4+16ynw8gpT/R+ypbjiCrQMuuw1wixERk5RvPWap5Zb6KXJIP2gu+3gikIJSaieiT7PArUJXuMkVSF+3dfgWO+XkXl8FyHhqQ/igoMrign2xidoviocFlL/nemyhFeQNxSYFWDwry3nV3D+GzDe2R4LR3EHgKETHiwxFbd5WHbzpN1VNrYcBx1l3bAt3iis+Nb4FP0jh874GDtlyqNtl/wBTHeGvLp/wUihTDNwCm78iG8f0QnALWjX8s7JL8mfkLSutngjP/ENiwIn/h2phj9BnML3D/KLunHb+mhf5ptOCMF0IRXyetO+U9AfTTFIPQZKcVcsQF1XNJbUu2Ch2XdhckWhFL/GP2flhPwq6F2Le0X73vNBYtSGUuhixpdXWVlPKfuXpbHNb8hzdPI7E6NGl3THASZ3vR3nu7fuB0WtqfqDotZUlGcafvUeoEcDh2Deo6BoPrheaKIn38d3VM+U9tecP4b9l3BM8r/nG77vFs7o4HpqAchK8sM3Hf1Q99+Cpxvp8vbgeklN6SdudgLjKcQJCtO6ZiuKouFMbZJucvJ/2QUpdQguP2m+LGNyOeRMuE7XU0kQ/RTvBrZZVOTXwnS/R8apFYuSKUQeeQj1YdkP7Jq/DkbySuo+gqccJZi3KgqCOPeuz6Pvo8Abz5nFVUkfsaRyh9ilqGRREO5kURvP8A50QEkeIXuf2Dhp7fqOuvVebgp5mLCLpWUbTOPcPXamtd8cZD7KY5/fSV6VlRPWZavJtE9DSbn+lfrVyu0LTJyggbzc8UO4QrcODh4KthUf+sVNiu5vKnwo+1GY5khebmcoO17jzQH1ZT7e0Lx07oA8Cy1llZfayeVjkibdVrdZVMSnvbkdK+mkL0mCFrVAuBIvqD+2Abj1zUELH3fxOEk1DqX7xcRpNvtE7gK40xWAvv3LHOZqdaN3TfRxUC2xBgdWqPqiUzpvXLysXAH4uYpeadnfNwqn1MvCgXe1y9YdDMCLs29a7D4+0W+tHKYNt6KTdjnIAwf4KFBxmXqsvnruD9nKHL2v+9KCV6kr43XxqfvfVm/seqxAWIW+eRdAyxjizUEXn7VlbCiKXnuPT9XMh3pzsMKnGqe3WitKV9EV21axl9mQBFi3QdwYVVt3snrmWGJWHvc5eeB82hivWYLP35luq+zIgEfyT7BBXKbp3QB1A/Q+wbls+uZAWeo3B8Fnp8Xv/FM8hIaYtBbqmc7y1j4E68l5jK0oXUdXXkwu2cADfgetYeMZObLBtgAAAABJRU5ErkJggg==\n",
      "text/latex": [
       "$\\displaystyle \\frac{I g m}{I + m r^{2}}$"
      ],
      "text/plain": [
       " I⋅g⋅m  \n",
       "────────\n",
       "       2\n",
       "I + m⋅r "
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "soln[T]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAFwAAAAxCAYAAABXhc7cAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFiklEQVR4Ae2bi3EbNxCGRY8L8KMDuQPF6cDqwI8KHHcgl5BROpBTQcbpwE4FfnRgdRCbHSjfBwEY3BGkjvRBRyq3MyCABbAAfuwtcLjl4urq6mimOgKLxeKckgeEY8Il4S14LYl3psUMeB27CPYF+Aj0Efn3RMfkf6m3GMa9N6za/7LW896sfyd/AvBq+840A74ZuhLcZEpK3ubWldL7Fd7MAgFMx5MeECcx/7nH3yo7a/hwuNxA501zOF6710ynFbT+ze5SrlvOGn4DgoD9G1UejAG2Xc2AbwAcsJ9R/CSBbZ6QbPmGluuL5nP4GmwisH9S7HEwkSblBQuQTiyJPzjeG8CZoOfeU8K3OHpfON4wOXm+eKhtpj2WvSVI6az8K+lP1P0jAvWK/L8E+b68fCQOFOWopZa9JjwlZK1VBnn7+0HkW2aHKF90GNtmEOARaNLAmD0BfEjjIC2o3jkIVhgb6XPT0IcYzooygbHwjPCs4LsgP1I+ti/lfKH8eeQrt1O3bDdWevJzOJokKAL1kBCIyV3CNy0Iapsa+Mk05GIsqRM0MXCOjh7F+DH8rM3w5Gctrcj5Sv2/Y1sX/XtMt4vocGrt9tHN2u14IAE24enAfI4jP2txLHfRcv00J3jef2TZpDfKSe1axpOeUqLGqYECU5L2+pKJL2WmmKR886UWy9K25/oyIlk/PCXmB8iJzdpFkwLOtNywpBqAfZ71BPariR4JbDINoYjFlOdiBj75bFrgrZMT2rb8mRrwYDPRvHAFWky0o5kF/yXpzkJEILXrWZNj/RfE2mj3A8uVmWhFTipoHjOgyWw4k1PrtL3eM4dxkNa81OyxoMmv2u/UPsXU8wSSTiQhtgxKck5S3duM7zuCqYiJLtE+H+9zYk8hjwlqe80eC5T8jobDk/+O0CdfWE6R66v5RVGY5NRMU1GtTXJvXnzS9ABI0yCwP31RlGTuU3xvysEArse/TOQ1Mdra/qkl1zn0xGSAA64vGl8iyAlHgX5XMRup/ODjKW24pkN7+jKC7hcWX+U7x7uDR7g3gb2z4b3x3bnsZCblziE5cEIz4AOBGqvaDPhYSA6U4x2oR7F/BtZP1V6zuXVeHNj4wmtcqjDHdQTmTbOOSzPubFKaQVsXPOU5vD6iA+fGFzrN9DHBe6GO89BsUkZc4Aj2Ro/b2aSMCDii/NRXkjeWHY/bZoCz2meE94SrGLw3uSD4qN1lKue3jBPNvOYmRbDp1C8vP+XIfogrxNzVeC/kHjL/AH4zDRcgOvSqVep/NLjmDvh10ATdKA6RVjxumwIOQn7NkfrfG6+5d/gXJRHsj2h26T/T3JkzaDid7qzhh7gmgL3W47b1OdwvOpOBzcRdcJ8yN63m/oj0kcxox+MW9neU7voqhESTr/Z04mTdMLMP4C590d6NZycZtEtf7TVphiyHtC8nYXzE2ROAtP11fAzJl3LW+iNSTwUL5cTKMdhv8Phy/i01PNnvSTQc7XbyegJIaviSCZf29FEowVMAfjlG+S5GoIqcTf6IXgLatvNNFvnhhKLAZsdCBupK6/sxyL2X+m4yPhV9cgKC0HcWsp5f93X4WSHkqVW6Ydhe/8VT8hlY+Gpf58imEPjybBsU5iY5ttmKENzKpPi4ZkfKXftBhsBkU7CtnNieZt15wtdX5VuF7+Ks9LdOTr/9Tfkmx0K0ImnqPhwH1dTO3T15yTF2PljHcftENPNHbAI4A57UftN/SSt+hJoJKmjX+wrR3B+xFeCaAU1VTbMsuhUCWEEV3D6w4QlkfNmmxwE9JU48/+6SND3J+SvW2zkaDXC1huBllZulAwwbEHk3w6nIcWzrj+g8mvkjNjuljIUwk/dp0bu2PNKNJf7W5RwC4JoEzdPy1tFp0OF/dF4ZTvUAv/EAAAAASUVORK5CYII=\n",
      "text/latex": [
       "$\\displaystyle - \\frac{g m r^{2}}{I + m r^{2}}$"
      ],
      "text/plain": [
       "      2 \n",
       "-g⋅m⋅r  \n",
       "────────\n",
       "       2\n",
       "I + m⋅r "
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "soln[a]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAEoAAAAnCAYAAACout71AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAEp0lEQVRoBe2agVFUMRBA7xgLAOkAO0DsADpArUDpAEpwsAPowNEO1AoY6UA6UK6D872QZPL//cN/XD7HMbczuSSbzWazu9mfSzKeTqejIWA8Hh/D94j0O/K/IT9hPHEj2g/JLO+RzkiCfYQ3pCtoP0O3T/k96U/EX4D/QTlA5CONfT6QDkjWA8gjlZfKYTSqnRDonPQ98aWsMrSIkwzjUT63DHyP6bRo2wZn4ynpsMCryNtUj/1LPr9oP454+TZoy36Lll/ArCpET3KCO4kxQt2At6rwepMWv7IMqMQJNKXlX4aW0WgXfPYecOJVYoAOPtfQf4vNGutvLC+fwbiqRyHRLSl7k/wBFWNhO9ZzHvHZa2K7npPpk4zgvpIyb8r38kn9auRbDFYNooW1uBMqwXh0g8ATkSmnKN566TWijF2ZXkQE6YNXWu/BJ3ZbPquqKMQxkApdE2/jpFMh1xZaoELSEgpNGEGcRgh46nkJgpvHJ/St8VNbUSEmYGm/cCU0PKFoeEe5ocCoAONW9pxI/5bcGGS8s12eCWb4pIZqOQNXi1EIpZWNLXuJL2WXYVe8cbLiO+NT6p9y6PyipS9cyG0DEp/9RDtE/sKRagECTrC2y+Cc3K/aLknv6oo3TlB8w6PAib8kteETiCP4fiS/KBoTn64lXJAtVxyr/SGBibmEVMjJkOMMzXur5gAoxW1ABuouRWNJ+yuYadalUE1RKMUN3q+onDR/FXTZsbxS+9rkNWOUS8x48S4q6xVl/7I0PvNro5mWoIPHqNZ4a1uttvTWVgM9Bd8oaqOonhroSebZx7AbqZ6CPHWyTTDvaaFNjOqpqJr7qJ5DPl2yuGn234T7Qf+jnrEPnCjxZumpBSAqyQ1yOCKi7r8KT0Fe275ZemrhDjx+LsHTin0UpnfNKoqGU7VJmsbk/7cLUuhQcnqG5XKOYckxx4Cbu/RUEkSeKAbXe4ZKuXdKzF8Pc/ntGKe2uqgh8mhEaB+q3WF7/joYyaurdQRPQ3Iw71QUBJ5SCu1z6zvsM//FuCrpB56U7xrnKSp4FIRLedQ66hMledTsfWHjRHbePsqTypUqCYE1lp5tMH2UtwlxzFdJSbH+l/r1zA0MQimggTy/BYBwhq4PDh4GxAfxoV+6cXH5mzIfym4Kg4zk+RaHsuM13htQL/nMfZsAnc4R2snlY3LccBvd5VEpPq3Mo7CkQl+RBD1qgmFyvKD+0gag5tuEn/DTAH7pMjBu984cIdWqd2ThVUXucU+BPgY/PbENDuyk2hei0nkz46XmDMBPK3r1ZX/fMhxRz4YDr7XzpzsxAC/OvsHY/+OT+vXKYdpYVnTSpfNDiHb7InX4OKG8ZBbpK23sT3FGRu/1fnfgVerMePP4tPvfV2989bBA8oqnsi3QM7ouNpWzcWkRZdcDB3mb0FAUg6w8PiFDCTNvClxOEBi32sYc9G1CW1EuFZdilxVtejRAISpDpbQVErweGXPMikIdkCecTyCTZyU+XyLdg7ItLUTyT7BBXKYeOVg3QK8SlGXRtwnOZZC3CXP/FNfQEELroZ7plJ/2GqwfncfQinLpuJQnjz6zygP+A+ryyqCcMfBcAAAAAElFTkSuQmCC\n",
      "text/latex": [
       "$\\displaystyle \\frac{g m r}{I + m r^{2}}$"
      ],
      "text/plain": [
       " g⋅m⋅r  \n",
       "────────\n",
       "       2\n",
       "I + m⋅r "
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "soln[alpha]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "The results are\n",
    "\n",
    "$T      = m g I / I^*   $\n",
    "\n",
    "$a      = -m g r^2 / I^* $\n",
    "\n",
    "$\\alpha = m g r / I^*    $\n",
    "\n",
    "where $I^*$ is the augmented moment of inertia, $I + m r^2$.\n",
    "\n",
    "You can also see [the derivation of these equations in this video](https://www.youtube.com/watch?v=chC7xVDKl4Q).\n",
    "\n",
    "To simulate the system, we don't really need $T$; we can plug $a$ and $\\alpha$ directly into the slope function."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "newton"
      ],
      "text/latex": [
       "$\\mathrm{newton}$"
      ],
      "text/plain": [
       "<Unit('newton')>"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "radian = UNITS.radian\n",
    "m = UNITS.meter\n",
    "s = UNITS.second\n",
    "kg = UNITS.kilogram\n",
    "N = UNITS.newton"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Exercise:**  Simulate the descent of a yo-yo.  How long does it take to reach the end of the string?\n",
    "\n",
    "I provide a `Params` object with the system parameters:\n",
    "\n",
    "* `Rmin` is the radius of the axle.  `Rmax` is the radius of the axle plus rolled string.\n",
    "\n",
    "* `Rout` is the radius of the yo-yo body.  `mass` is the total mass of the yo-yo, ignoring the string.  \n",
    "\n",
    "* `L` is the length of the string.\n",
    "\n",
    "* `g` is the acceleration of gravity."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>values</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>Rmin</th>\n",
       "      <td>0.008 meter</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Rmax</th>\n",
       "      <td>0.016 meter</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Rout</th>\n",
       "      <td>0.035 meter</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mass</th>\n",
       "      <td>0.05 kilogram</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>L</th>\n",
       "      <td>1 meter</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>g</th>\n",
       "      <td>9.8 meter / second ** 2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>t_end</th>\n",
       "      <td>1 second</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "Rmin                 0.008 meter\n",
       "Rmax                 0.016 meter\n",
       "Rout                 0.035 meter\n",
       "mass               0.05 kilogram\n",
       "L                        1 meter\n",
       "g        9.8 meter / second ** 2\n",
       "t_end                   1 second\n",
       "dtype: object"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "params = Params(Rmin = 8e-3 * m,\n",
    "                Rmax = 16e-3 * m,\n",
    "                Rout = 35e-3 * m,\n",
    "                mass = 50e-3 * kg,\n",
    "                L = 1 * m,\n",
    "                g = 9.8 * m / s**2,\n",
    "                t_end = 1 * s)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Here's a `make_system` function that computes `I` and `k` based on the system parameters.\n",
    "\n",
    "I estimated `I` by modeling the yo-yo as a solid cylinder with uniform density ([see here](https://en.wikipedia.org/wiki/List_of_moments_of_inertia)).\n",
    "\n",
    "In reality, the distribution of weight in a yo-yo is often designed to achieve desired effects.  But we'll keep it simple."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "def make_system(params):\n",
    "    \"\"\"Make a system object.\n",
    "    \n",
    "    params: Params with Rmin, Rmax, Rout, \n",
    "                              mass, L, g, t_end\n",
    "    \n",
    "    returns: System with init, k, Rmin, Rmax, mass,\n",
    "                         I, g, ts\n",
    "    \"\"\"\n",
    "    L, mass = params.L, params.mass\n",
    "    Rout, Rmax, Rmin = params.Rout, params.Rmax, params.Rmin \n",
    "    \n",
    "    init = State(theta = 0 * radian,\n",
    "                 omega = 0 * radian/s,\n",
    "                 y = L,\n",
    "                 v = 0 * m / s)\n",
    "    \n",
    "    I = mass * Rout**2 / 2\n",
    "    k = (Rmax**2 - Rmin**2) / 2 / L / radian    \n",
    "    \n",
    "    return System(params, init=init, I=I, k=k)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Testing `make_system`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>values</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>Rmin</th>\n",
       "      <td>0.008 meter</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Rmax</th>\n",
       "      <td>0.016 meter</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Rout</th>\n",
       "      <td>0.035 meter</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mass</th>\n",
       "      <td>0.05 kilogram</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>L</th>\n",
       "      <td>1 meter</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>g</th>\n",
       "      <td>9.8 meter / second ** 2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>t_end</th>\n",
       "      <td>1 second</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>init</th>\n",
       "      <td>theta               0 radian\n",
       "omega    0.0 radi...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>I</th>\n",
       "      <td>3.0625000000000006e-05 kilogram * meter ** 2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>k</th>\n",
       "      <td>9.6e-05 meter / radian</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "Rmin                                           0.008 meter\n",
       "Rmax                                           0.016 meter\n",
       "Rout                                           0.035 meter\n",
       "mass                                         0.05 kilogram\n",
       "L                                                  1 meter\n",
       "g                                  9.8 meter / second ** 2\n",
       "t_end                                             1 second\n",
       "init     theta               0 radian\n",
       "omega    0.0 radi...\n",
       "I             3.0625000000000006e-05 kilogram * meter ** 2\n",
       "k                                   9.6e-05 meter / radian\n",
       "dtype: object"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "system = make_system(params)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>values</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>theta</th>\n",
       "      <td>0 radian</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>omega</th>\n",
       "      <td>0.0 radian / second</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>y</th>\n",
       "      <td>1 meter</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>v</th>\n",
       "      <td>0.0 meter / second</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "theta               0 radian\n",
       "omega    0.0 radian / second\n",
       "y                    1 meter\n",
       "v         0.0 meter / second\n",
       "dtype: object"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "system.init"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Write a slope function for this system, using these results from the book:\n",
    "\n",
    "$ r = \\sqrt{2 k y + R_{min}^2} $ \n",
    "\n",
    "$ T      = m g I / I^*  $\n",
    "\n",
    "$ a      = -m g r^2 / I^* $\n",
    "\n",
    "$ \\alpha  = m g r / I^*  $\n",
    "\n",
    "where $I^*$ is the augmented moment of inertia, $I + m r^2$.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Solution\n",
    "\n",
    "def slope_func(state, t, system):\n",
    "    \"\"\"Computes the derivatives of the state variables.\n",
    "    \n",
    "    state: State object with theta, omega, y, v\n",
    "    t: time\n",
    "    system: System object with Rmin, k, I, mass\n",
    "    \n",
    "    returns: sequence of derivatives\n",
    "    \"\"\"\n",
    "    theta, omega, y, v = state\n",
    "    g, k, Rmin = system.g, system.k, system.Rmin\n",
    "    I, mass = system.I, system.mass\n",
    "    \n",
    "    r = sqrt(2*k*y + Rmin**2)\n",
    "    alpha = mass * g * r / (I + mass * r**2)\n",
    "    a = -r * alpha\n",
    "        \n",
    "    return omega, alpha, v, a        "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Test your slope function with the initial paramss."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(0.0 <Unit('radian / second')>,\n",
       " 180.54116292458264 <Unit('1 / radian ** 0.5 / second ** 2')>,\n",
       " 0.0 <Unit('meter / second')>,\n",
       " -2.888658606793322 <Unit('meter / radian / second ** 2')>)"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Solution\n",
    "\n",
    "slope_func(system.init, 0*s, system)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Write an event function that will stop the simulation when `y` is 0."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Solution\n",
    "\n",
    "def event_func(state, t, system):\n",
    "    \"\"\"Stops when y is 0.\n",
    "    \n",
    "    state: State object with theta, omega, y, v\n",
    "    t: time\n",
    "    system: System object with Rmin, k, I, mass\n",
    "    \n",
    "    returns: y\n",
    "    \"\"\"\n",
    "    theta, omega, y, v = state\n",
    "    return y"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Test your event function:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "1 meter"
      ],
      "text/latex": [
       "$1\\ \\mathrm{meter}$"
      ],
      "text/plain": [
       "1 <Unit('meter')>"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Solution\n",
    "\n",
    "event_func(system.init, 0*s, system)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Then run the simulation."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>values</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>sol</th>\n",
       "      <td>None</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>t_events</th>\n",
       "      <td>[[0.879217870162702]]</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>nfev</th>\n",
       "      <td>134</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>njev</th>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>nlu</th>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>status</th>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>message</th>\n",
       "      <td>A termination event occurred.</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>success</th>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "sol                                  None\n",
       "t_events            [[0.879217870162702]]\n",
       "nfev                                  134\n",
       "njev                                    0\n",
       "nlu                                     0\n",
       "status                                  1\n",
       "message     A termination event occurred.\n",
       "success                              True\n",
       "dtype: object"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Solution\n",
    "\n",
    "results, details = run_ode_solver(system, slope_func, events=event_func, max_step=0.05)\n",
    "details"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Check the final state.  If things have gone according to plan, the final value of `y` should be close to 0."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>theta</th>\n",
       "      <th>omega</th>\n",
       "      <th>y</th>\n",
       "      <th>v</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0.706147</th>\n",
       "      <td>44.0182</td>\n",
       "      <td>121.32</td>\n",
       "      <td>0.327291</td>\n",
       "      <td>-1.76573</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0.756147</th>\n",
       "      <td>50.268</td>\n",
       "      <td>128.609</td>\n",
       "      <td>0.236982</td>\n",
       "      <td>-1.84499</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0.806147</th>\n",
       "      <td>56.8724</td>\n",
       "      <td>135.496</td>\n",
       "      <td>0.142962</td>\n",
       "      <td>-1.91405</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0.856147</th>\n",
       "      <td>63.8093</td>\n",
       "      <td>141.885</td>\n",
       "      <td>0.0457628</td>\n",
       "      <td>-1.97198</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0.879218</th>\n",
       "      <td>67.1147</td>\n",
       "      <td>144.631</td>\n",
       "      <td>9.02056e-17</td>\n",
       "      <td>-1.99469</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "            theta    omega            y        v\n",
       "0.706147  44.0182   121.32     0.327291 -1.76573\n",
       "0.756147   50.268  128.609     0.236982 -1.84499\n",
       "0.806147  56.8724  135.496     0.142962 -1.91405\n",
       "0.856147  63.8093  141.885    0.0457628 -1.97198\n",
       "0.879218  67.1147  144.631  9.02056e-17 -1.99469"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Solution\n",
    "\n",
    "results.tail()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Plot the results."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`theta` should increase and accelerate."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "def plot_theta(results):\n",
    "    plot(results.theta, color='C0', label='theta')\n",
    "    decorate(xlabel='Time (s)',\n",
    "             ylabel='Angle (rad)')\n",
    "plot_theta(results)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`y` should decrease and accelerate down."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "def plot_y(results):\n",
    "    plot(results.y, color='C1', label='y')\n",
    "\n",
    "    decorate(xlabel='Time (s)',\n",
    "             ylabel='Length (m)')\n",
    "    \n",
    "plot_y(results)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Plot velocity as a function of time; is the yo-yo accelerating?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Solution\n",
    "\n",
    "v = results.v # m / s\n",
    "plot(v)\n",
    "decorate(xlabel='Time (s)',\n",
    "         ylabel='Velocity (m/s)')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Use `gradient` to estimate the derivative of `v`.  How does the acceleration of the yo-yo compare to `g`?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Solution\n",
    "\n",
    "a = gradient(v)\n",
    "plot(a)\n",
    "decorate(xlabel='Time (s)',\n",
    "         ylabel='Acceleration (m/$s^2$)')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
